<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
	<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=iso-8859-15">
	<TITLE>Pyturtle. Una Tartaruga per Python</TITLE>
	<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.9.104  (Linux)">
	<META NAME="AUTHOR" CONTENT="Daniele Zambelli">
	<META NAME="CREATED" CONTENT="20050115;21443800">
	<META NAME="CHANGED" CONTENT="20060222;10041300">
	<META NAME="DESCRIPTION" CONTENT="La grafica della tartaruga per Python. Turtle graphics for Python">
	<STYLE>
	<!--
		@page { size: 21cm 29.7cm; margin: 2cm }
		TD P { margin-bottom: 0.21cm }
		TD P.western { font-family: "Helvetica", sans-serif; font-weight: medium }
		H1 { margin-bottom: 0.21cm; color: #b84747 }
		H1.western { font-family: "Helvetica", sans-serif; font-size: 16pt }
		H1.cjk { font-family: "Mincho"; font-size: 16pt }
		H1.ctl { font-family: "Tahoma", "Lucidasans", "Lucida Sans", "Arial Unicode MS"; font-size: 16pt }
		P { margin-bottom: 0.21cm }
		P.western { font-family: "Helvetica", sans-serif; font-weight: medium }
		H2 { margin-bottom: 0.21cm; color: #008080 }
		H2.western { font-family: "Helvetica", sans-serif; font-size: 14pt; font-style: italic }
		H2.cjk { font-family: "Mincho"; font-size: 14pt; font-style: italic }
		H2.ctl { font-size: 14pt; font-style: italic }
		H3 { margin-top: 0.22cm; margin-bottom: 0.11cm; color: #800080 }
		H3.western { font-family: "Helvetica", sans-serif; font-size: 12pt; font-style: italic }
		H3.cjk { font-family: "Mincho" }
		TH P { margin-bottom: 0.21cm }
		TH P.western { font-family: "Helvetica", sans-serif; font-style: italic }
		TH P.cjk { font-style: italic }
		TH P.ctl { font-style: italic }
		KBD { color: #808000 }
	-->
	</STYLE>
</HEAD>
<BODY LANG="it-IT" DIR="LTR">
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#94006b"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=7 STYLE="font-size: 44pt">Pyturtle</FONT></FONT></FONT></P>
<P CLASS="western"><BR><BR>
</P>
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#94476b"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=6 STYLE="font-size: 22pt">Una
tartaruga in Python</FONT></FONT></FONT></P>
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#944794"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>(Daniele
Zambelli 2005)</FONT></FONT></FONT></P>
<P CLASS="western" ALIGN=CENTER><FONT COLOR="#944794"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>www.verona.linux.it<BR>daniele.zambelli@inwind.it</FONT></FONT></FONT></P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm">In questo
testo ci sono:<BR>alcuni esempi di uso della libreria
pyturtle.py,<BR>un'introduzione alla turtle graphics.</P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm">La
libreria <KBD>pyturtle.py</KBD> mette a disposizione gli strumenti
essenziali per<BR>realizzare la ceometria della tartaruga.</P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm">&Egrave;
inserita nel pacchetto <KBD>pygraph</KBD> che contiene anche le
librerie:<BR><KBD>pyplot</KBD> per il disegno di funzioni piane,
<BR><KBD>pyig</KBD> per la geometria interattiva <BR>e <KBD>pycart</KBD>
la libreria che serve da base per tutte le altre.</P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm"><KBD>pygraph</KBD>
&egrave; anche inserito all'interno della distribuzione
<BR><KBD>EduKnoppix</KBD>.<BR><FONT COLOR="#944794">http://www.eduknoppix.org</FONT></P>
<P CLASS="western" ALIGN=CENTER STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<DIV ID="Indice generale1" DIR="LTR" STYLE="background: transparent">
	<P CLASS="western">0. <A HREF="#intro">Introduzione</A> <BR>1.
	<A HREF="#esempi">Esempi</A> <BR>2. <A HREF="#tarta">La grafica
	della Tartaruga</A> <BR>2.1. <A HREF="#libreria">Caricare la
	libreria</A> <BR>2.2. <A HREF="#comandi">I primi comandi di
	Tartaruga</A> <BR>2.3. <A HREF="#programma">Il primo programma</A>
	<BR>2.4. <A HREF="#procedure">Procedure e sotto procedure</A> <BR>2.5.
	<A HREF="#parametri">Parametri</A> <BR>2.6. <A HREF="#quadrati">Quadrati</A>
	<BR>2.7. <A HREF="#frattali">Figure frattali</A> <BR>2.8. <A HREF="#tartarughe">Creare
	nuove tartarughe</A> <BR>3. <A HREF="#licenza">Licenza</A> <BR>4.
	<A HREF="#biblio">Bibliografia</A> 
	</P>
</DIV>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="intro"></A>0. Introduzione</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se mi stai leggendo,
forse non hai mai provato a scrivere un &quot;programma&quot; per un
computer, magari perch&eacute; pensi che sia una cosa estremamente
complicata, da lasciare agli addetti ai lavori. <KBD>Python</KBD> &egrave;
un linguaggio di programmazione estremamente potente, ma anche molto
semplice. Imparare a programmare usando Python, pu&ograve; essere
interessante, divertente e anche alla portata di tutti.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">La
libreria grafica &quot;pyturtle&quot; permette di &quot;pasticciare&quot;
con la geometria della tartaruga (Turtle geometry), esplorare questo
particolare ambiente imparando, contemporaneamente le basi della
programmazione.</FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Pu&ograve; essere
interessante utilizzare <KBD>Python</KBD> e <KBD>pyturtle</KBD> nella
scuola (secondaria di primo e secondo grado):</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">se si ritiene che
	abbia ancora senso insegnare agli studenti le basi della
	programmazione,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">se lo si vuole
	fare con un linguaggio semplice nella sintassi ma potente,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">se si ritiene che
	l'uso della grafica possa rendere pi&ugrave; immediato l'approccio
	ad una disciplina per altro difficile.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm">In questa directory
sono riportati alcuni esempi di uso di <KBD>Python</KBD> con la
grafica della tartaruga. In questo testo, oltre ad una breve
introduzione ad ogni esempio, c'&egrave; una semplice introduzione
all'uso della libreria pyturtle e al linguaggio <KBD>Python</KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Nel <A HREF="#2.Esempi|outline"><B>capitolo
1</B></A> spiego come eseguire gli esempi e come visualizzarne il
sorgente. Sempre in questo capitolo c'&egrave; una breve descrizione
di ogni esempio.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Nel <A HREF="#3.La grafica della Tartaruga|outline"><B>capitolo
2</B></A> illustro un possibile percorso che accompagna, passo passo,
da zero alla realizzazione di programmi e di funzioni ricorsive.
Questo percorso &egrave; molto simile a quello che proponevo ai miei
studenti utilizzando il linguaggio di programmazione Logo. La
semplicit&agrave; della sintassi &egrave; praticamente la stessa, una
caratteristica in pi&ugrave; fornita da Pyturtle &egrave; che si pu&ograve;
introdurre, in modo naturale, la programmazione orientata agli
oggetti.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Prima di procedere
mettiamo in chiaro un aspetto critico: la licenza. Tutto il materiale
che trovate qui &egrave; frutto del mio lavoro e della mia fatica. In
particolare tutti gli errori, le imprecisioni e le sciocchezze che
potete scoprire in questo testo sono di mia propriet&agrave;
(intellettuale). Perci&ograve;, prima di pensare di riutilizzare
questo testo per i vostri scopi, andate a leggervi le condizioni di
licenza al <A HREF="#5.Licenza|outline"><B>capitolo 3</B></A>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Lo scopo di questo
testo &egrave; assolutamente introduttivo, non &egrave; possibile
presentare in modo esauriente il linguaggio Python o la grafica della
tartaruga in poche pagine. La bibliografia finale, <A HREF="#6.Bibliografia|outline"><B>capitolo
4</B></A>, pu&ograve; dare qualche indicazione per continuare
l'esplorazione della grafica della Tartaruga e di <KBD>Python</KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif">Buon
divertimento!</FONT></P>
<H1 CLASS="western"><A NAME="esempi"></A>1. Esempi</H1>
<P CLASS="western">Per osservare gli esempi il modo, a mio giudizio
migliore, &egrave; quello di:</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">aprire una
	consolle di comando: dal pannello di controllo cliccare sull'icona
	che presenta un monitor nero con una conchiglia (programma
	terminale),</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">spostarsi nella
	directory che contiene i programmi: all'interno della consolle
	scrivere il comando: <KBD><FONT FACE="Bitstream Vera Sans Mono">cd
	/opt/esempi/pygraph/</FONT></KBD>,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">avviare IDLE:
	<FONT FACE="Bitstream Vera Sans Mono"><KBD>idle-python2.4</KBD>
	<FONT FACE="Helvetica, sans-serif">(potrebbe anche essere
	</FONT><KBD>idle-python2.4</KBD></FONT>)</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Una volta aperta
	la finestra principale di IDLE,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Caricare gli
	esempi: dal menu: <FONT FACE="Bitstream Vera Sans Mono"><KBD>File &ndash;
	Open</KBD>...</FONT>,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Eseguire l'esempio
	premendo il tasto <KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;F5&gt;</FONT></KBD>.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H3 CLASS="western">Osservazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">La consolle mette
	a disposizione un meccanismo di autocompletamento che semplifica la
	scrittura dei comandi. Per spostarsi nella directory degli esempi di
	pygraph basta premere i seguenti tasti: <KBD><FONT FACE="Bitstream Vera Sans Mono">cd
	/o&lt;tab&gt;es&lt;tab&gt;p&lt;tab&gt;&lt;invio&gt;</FONT></KBD> e
	per eseguire <KBD>idle-python2.3</KBD> basta premere i 5 tasti
	<KBD><FONT FACE="Bitstream Vera Sans Mono">idl&lt;tab&gt;&lt;invio&gt;</FONT></KBD>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">La directory dove
	sono scritti gli esempi &egrave; a sola lettura. Se vogliamo
	modificarne uno dobbiamo salvarlo in una directory che permetta
	anche la scrittura: dal menu: <FONT FACE="Bitstream Vera Sans Mono">File
	&ndash; <KBD>Save as ..</KBD>.</FONT>e salvare, ad esempio, in
	<KBD><FONT FACE="Bitstream Vera Sans Mono">/home/knoppix/desktop/</FONT></KBD>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">In questo modo &egrave;
	facile aggiungere commenti o modificare il codice stesso per vedere
	gli effetti delle variazioni apportate. Uno dei migliori modi per
	capire come funziona un programma &egrave; quello di modificarlo e
	osservare cosa succede</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Non bisogna
	dimenticarsi che dopo ogni modifica, per vederne l'effetto, bisogna
	eseguire il programma premendo: <KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;F5&gt;</FONT></KBD>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Se EduKnoppix &egrave;
	stata installata su HD, conviene copiare tutti gli esempi in una
	directory all'interno della propria cartella e eseguirli da l&igrave;
	dove possono essere modificati a piacere.</P>
</UL>
<H2 CLASS="western">1.2. 01casetta.py, 02casa.py, 03villaggio.py,
04parametri.py, 05quadrati.py, 06sierpinski.py, 07gattopo.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Sono gli esempi
descritti e spesso costruiti passo passo nel capitolo 2.</P>
<H3 CLASS="western">Variazioni</H3>
<UL SRC="pyturtle_html_m3e4ab3bf.gif" WIDTH=12 HEIGHT=12 ALIGN=ABSMIDDLE>
	<P CLASS="western" STYLE="margin-bottom: 0cm">Conviene effettuare
	variazioni a questi programmi solo dopo aver letto la loro
	descrizione.</P>
</UL>
<H2 CLASS="western">1.3. albero.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">A partire da un albero
binario si possono ottenere diverse variazioni via via pi&ugrave;
complicate. Invece di eliminare il codice modificato, viene
&quot;commentato&quot; (menu: <KBD><FONT FACE="Bitstream Vera Sans Mono">Format
&ndash; Comment Out Region</FONT></KBD>) in questo modo resta traccia
del percorso svolto. Questa nuova foresta presenta anche alberi
ternari, alberi che hanno tronchi pi&ugrave; grossi dei rami e alberi
che crescono in modo non perfettamente regolare.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Disegnare alberi
	di colori diversi.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Alberi che
	cambiano colore dal tronco ai ramoscelli.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Alberi con un
	fiorellino in fondo ai rami.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Mettere un
	fiorellino solo in alcuni nodi a caso.</P>
</UL>
<H2 CLASS="western">1.4. archi.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Variazioni su cerchi,
segmenti circolari e settori circolari con abbondante uso di elementi
casuali. Alcune funzioni di supporto servono per spostare Tartaruga
in un punto preciso o casuale del suo territorio o per scegliere un
colore a caso fornendo le sue componenti RGB.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Data una lista di
	numeri costruire un grafo a torta che rappresenti i dati.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Separare tutti gli
	spicchi.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Separare uno
	spicchio.</P>
</UL>
<H2 CLASS="western">1.5. bogon.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">(Chiocciola in dialetto
veneto) Una spirale di triangoli equilateri di colore marrone
realizzata da due semplici procedure.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; font-style: normal">
	Cambiare il colore della &quot;bogonela&quot;.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; font-style: normal">
	Una chiocciola con il colore cangiante.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; font-style: normal">
	Parametrizzare la procedura bogonela in modo da poter disegnare
	chiocciole giovani o vecchie.</P>
</UL>
<H2 CLASS="western">1.6. citta.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Disegna una citt&agrave;
fatta da palazzi modulari.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; font-style: normal">
	Cambiare il colore dei palazzi.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; font-style: normal">
	Distanziare i palazzi gli uni dagli altri.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm; font-style: normal">
	Realizzare moduli diversi.</P>
</UL>
<H2 CLASS="western">1.7. crollo.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Un muro di mattoncini
colorati che sta crollando. &Egrave; una variazione dell'esempio
riportato nel manualetto di Pygraph. &Egrave; anche un esempio di
classe derivata da una classe base. Infatti, che realizza il disegno
non &egrave; la tartaruga di Pyturtle, ma una sua discendente capace
anche di disegnare quadrati, mattoni e muri (pi&ugrave; o meno
stabili).</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Cambiare la gamma
	dei colori.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Cambiare il
	livello di disordine.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Derivare da
	MiaTurtle una discendente che realizzi muri fatti di mattoni
	rettangolari invece che quadrati.</P>
</UL>
<H2 CLASS="western">1.8. democart.py, demoplot.py, demorig.py,
demoturtle.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questi tre programmi
contengono una procedura per ogni metodo messo a disposizione da
pycart.py, pyplot.py, pyturtle.py. Servono per verificare che, quando
viene apportata qualche modifica alle librerie, tutto funzioni ancora
correttamente. Sono anche Le procedure utilizzate come esempio nel
manualetto, dove ogni metodo delle librerie &egrave; commentato. Il
file demorig.py riproduce il programma di esempio che si trova nella
libreria originale turtle.py di Python.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Se vengono
	aggiunti metodi a Plane, Plot o Turtle, qui vanno aggiunte delle
	procedure che utilizzino quei metodi in modo da poter servire da
	esempio di uso e da controllo del funzionamento.</P>
</UL>
<H2 CLASS="western">1.9. figure.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una gerarchia di classi
che implementa delle figure geometriche. Pu&ograve; essere
interessante per vedere come funziona l'ereditariet&agrave; tra le
classi. &Egrave; appositamente incompleta...</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Aggiungere altre
	classi.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Aggiungere altre
	propriet&agrave; e metodi cercando il punto adatto della gerarchia
	dove intervenire.</P>
</UL>
<H2 CLASS="western">1.10. fiore.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Un fiorellino ottenuto
a partire da un modulo: petalo. Il tutto &egrave; realizzato con 3
procedure.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Aggiungere un po'
	di colore.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Aggiungere altri
	fiori oltre alla dalia.</P>
</UL>
<H2 CLASS="western">1.11. gas.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una bombola piena di
molecole di un gas che si muovono in modo caotico. In realt&agrave;
le molecole di questo gas non hanno interazioni tra di loro, ma solo
con le pareti. Sia Bombola sia Molecola, sono delle classi con due
metodi. I rispettivi metodi <FONT FACE="Bitstream Vera Sans Mono">__init__</FONT>
presentano diversi parametri che permettono di cambiare alcuni
aspetti della simulazione.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Senza modificare
	il codice delle classi, studiare tutti i cambiamenti che si possono
	effettuare agendo sui parametri.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Fare in modo che
	le molecole interagiscano rimbalzando quando si scontrano.</P>
</UL>
<H2 CLASS="western">1.12. gattopo.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Un gatto insegue un
topolino che gira impazzito lungo le pareti di una stanza quadrata.
Il gatto parte dal centro della stanza. Modificando la velocit&agrave;
dei due protagonisti si pu&ograve; fare in modo che il topo si salvi,
continueranno a girare indefinitamente (finch&eacute; qualche anima
pia non premer&agrave; <FONT FACE="Bitstream Vera Sans Mono">&lt;ctrl
&ndash; c&gt;</FONT>), o che il topo venga agguantato in poco tempo.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Il topo potrebbe
	essere un po' pi&ugrave; fantasioso nella sua strategia di fuga.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Gatto e topo si
	muovono come avessero massa zero: aggiungere un po' di inerzia.</P>
</UL>
<H2 CLASS="western">1.13. koch.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Quando frequentavo le
elementari, pensavo che in tutte le figure geometriche l'area fosse
sempre pi&ugrave; grande del perimetro... procedendo con gli studi ho
capito che questa era un'idea sbagliata. I matematici sono riusciti a
immaginare figure che hanno una superficie limitata e un perimetro
infinito. Una di queste &egrave; il &quot;fiocco di neve&quot; o
curva di Koch. &Egrave; una curva frattale che pu&ograve; essere
disegnata con una procedura ricorsiva. Se poi inseriamo anche il
caso, le cose possono complicarsi... producendo delle fantastiche
isole. La procedura fioccodati, calcola perimetro e aree dei fiocchi
con diversi livelli di ricorsione.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">AdSi possono
	disegnare fiocchi quadrati con protuberanze quadrate.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">O esagonali...</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">O ...</P>
</UL>
<H2 CLASS="western">1.14. luoghi.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Le coniche (ellissi,
parabole, iperboli) possono essere viste come l'inviluppo degli assi
di particolari segmenti. Tracciare l'asse di un segmento, con la
geometria della Tartaruga &egrave; molto semplice, quindi, facendo
muovere Tartaruga lungo una circonferenza o una retta, possiamo
ottenere le coniche come inviluppo di rette.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Cambiando il
	valore dei parametri possiamo capire meglio il loro significato.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Cambiare il colore
	degli assi.</P>
</UL>
<H2 CLASS="western">1.15. man1.py man2.py man3.py man4.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Gli esempi utilizzati
dal manualetto di Pygraph</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Da modificare se
	modificate il testo del manuale.</P>
</UL>
<H2 CLASS="western">1.16. orologio.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Esistono ancora gli
orologi con le lancette? Tartaruga non ha problemi a mettervene uno a
disposizione nella vostra scrivania, sincronizzato, al secondo, con
il vostro computer.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Cambiare la forma
	del quadrante.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Cambiare il colore
	o la forma delle sfere.</P>
</UL>
<H2 CLASS="western">1.17. palla.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una classe che
implementa una palla in grado di &quot;saltare&quot; da una parte
all'altra dello schermo, di muoversi di moto rettilineo uniforme o di
moto accelerato.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Usare la classe
	per &quot;simulare&quot; situazioni fisiche come caduta dei gravi,
	moto inerziale...</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Completare la
	classe con altri metodi.</P>
</UL>
<H2 CLASS="western">1.18. palle.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una gerarchia di palle:
statiche o in movimento: Un raffinamento della classe implementata
nel file <FONT FACE="Bitstream Vera Sans Mono">palla.py</FONT>.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Usare la classe
	per &quot;simulare&quot; situazioni fisiche come caduta dei gravi,
	moto inerziale...</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Completare la
	classe con altri metodi.</P>
</UL>
<H2 CLASS="western">1.19. quadrati.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Giocare con le figure
geometriche pu&ograve; essere istruttivo. Qui vengono disegnati
quadrati uno dentro l'altro oppure quadrati che crescono secondo la
sequenza di Fibonacci...</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Si pu&ograve;
	realizzare qualcosa di simile con triangoli.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Si possono mettere
	quadrati in fila uno di seguito all'altro (ricordarsi di riportare
	sempre Tartaruga nella posizione iniziale).</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">O metterli uno di
	seguito all'altro ma un po' ruotati in modo da ottenere una specie
	di spirale di quadrati.</P>
</UL>
<H2 CLASS="western">1.20. ricorsione.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Qui sono riunite alcune
procedure ricorsive gi&agrave; viste.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Ci sono molte
	altre figure ricorsive da aggiungere: spirali, triangolo di
	Sierpinski e derivati, curva C, curva del Dragone, curva di Hilbert,
	...</P>
</UL>
<H2 CLASS="western">1.21. tarta.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Uno stupidissimo test
di alcuni metodi della classe Turtle</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">A fantasia</P>
</UL>
<H2 CLASS="western">1.22. trasfor.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Traslazioni, simmetrie,
omotetie di figure nel piano cartesiano.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Aggiungere altre
	trasformazioni.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Combinare assieme
	diverse trasformazioni.</P>
</UL>
<H2 CLASS="western">1.23. trirett.py</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una Procedura per far
disegnare a Tartaruga un triangolo rettangolo e poi inviluppi di
triangoli rettangoli.</P>
<H3 CLASS="western">Variazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Modificare i
	colori.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Disegnare
	triangoli dati i due lati e l'angolo compreso.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Inventare altri
	inviluppi.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="tarta"></A>2. La grafica della Tartaruga</H1>
<P CLASS="western">Per seguire le attivit&agrave; di questo capitolo
bisogna avviare IDLE di Python e scrivere i comandi al suo interno:</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">aprire una
	consolle di comando: dal pannello di controllo cliccare sull'icona
	che presenta un monitor nero con una conchiglia (programma
	terminale),</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">avviare IDLE:
	<KBD><FONT FACE="Bitstream Vera Sans Mono">idle-python2.3</FONT></KBD>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Una volta aperta
	la finestra principale di IDLE, 
	</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Scrivere i comandi
	dopo il prompt: &quot;<KBD>&gt;&gt;&gt;</KBD>&quot;,</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Terminato il
	comando, premere il tasto <KBD>&lt;Invio&gt;</KBD> e osservarne
	l'effetto.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H3 CLASS="western">Osservazioni</H3>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">La consolle mette
	a disposizione un meccanismo di autocompletamento che semplifica la
	scrittura dei comandi. Per eseguire idle-python2.3 basta premere i 5
	tasti <KBD><FONT FACE="Bitstream Vera Sans Mono">idl&lt;tab&gt;&lt;invio&gt;</FONT></KBD>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">All'interno di
	IDLE &egrave; possibile riprendere un comando dato precedentemente,
	portando il cursore su quella riga e premendo <KBD>&lt;invio&gt;</KBD>.</P>
</UL>
<H2 CLASS="western"><A NAME="libreria"></A>2.1. Caricare la libreria</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm"><KBD>Python</KBD> come
la maggior parte dei linguaggi moderni ha un ristretto (si fa per
dire) numero di istruzioni interne che formano il nocciolo del
linguaggio e una grandissima quantit&agrave; di librerie che ne
estendono le potenzialit&agrave;. La grafica della tartaruga &egrave;
un'estensione di <KBD>Python</KBD>, si trova nella libreria pyturtle
e, per utilizzarla, va innanzitutto caricata. Questo lo si pu&ograve;
fare in diversi modi.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il primo e pi&ugrave;
semplice, ma anche il meno corretto &egrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
from pyturtle import *</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questo comando dice che
tutte gli elementi presenti in <KBD>pyturtle.py</KBD> vengono messi a
disposizione del programmatore. &Egrave; il metodo pi&ugrave;
semplice ma pu&ograve; dare alcuni problemi quando importo pi&ugrave;
librerie, perch&eacute; gli elementi di una potrebbero andare in
conflitto con gli elementi di un'altra.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Un altro modo consiste
nell'indicare esplicitamente quale, o quali elementi di una libreria
ci interessa caricare. Nel caso della libreria <KBD>pyturtle.py</KBD>
ci interessa caricare solo la classe Turtle(). Quindi il comando pu&ograve;
essere:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
from pyturtle import Turtle</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Sia che abbiamo
caricato la libreria intera, sia che abbiamo caricato solo <KBD>Turtle</KBD>,
adesso possiamo creare l'elemento base della grafica della tartaruga:
le tartarughe. Per farlo dobbiamo inventare un nome (meglio se breve
per non stressarci in seguito) e creare un oggetto della classe
<KBD>Turtle()</KBD>:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
tina=Turtle()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questo comando apre una
finestra grafica e pone in mezzo, orientata a destra una freccetta
(la nostra tartaruga <KBD>tina</KBD>). Questi due comandi sono quanto
serve per poter incominciare a esplorare la geometria della
tartaruga.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ma complichiamoci un
po' la vita. Perch&egrave; una sola tartaruga? Possiamo crearne
quante vogliamo:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
pina=Turtle()<BR>&gt;&gt;&gt; gina=Turtle()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">In questo modo per&ograve;
ogni tartaruga viene creata in un suo proprio ambiente. &Egrave;
possibile anche fare convivere pi&ugrave; tartarughe nella stessa
finestra grafica. Chiudiamo le finestre precedenti e ripartiamo da
zero:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
tina=Turtle()<BR>&gt;&gt;&gt; gina=Turtle(tina.getplane())</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">In questo modo diciamo
a g<KBD><FONT FACE="Bitstream Vera Sans Mono">ina</FONT></KBD> che
deve condividere lo stesso ambiente (<KBD><FONT FACE="Bitstream Vera Sans Mono">plane</FONT></KBD>)
di <KBD><FONT FACE="Bitstream Vera Sans Mono">tina</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Apparentemente non &egrave;
cambiato nulla. In realt&agrave; ci sono due tartarughe nella stessa
posizione. Cambiamo il colore alla seconda e vediamo l'effetto:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
gina.setcolor('green')</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Adesso possiamo
distinguere <KBD><FONT FACE="Bitstream Vera Sans Mono">gina</FONT></KBD>.
Allo stesso modo creiamo <KBD><FONT FACE="Bitstream Vera Sans Mono">pina</FONT></KBD>
e facciamola rossa:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
pina=Turtle(tina.getplane())</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
pina.setcolor('red')</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ora possiamo dare dei
comandi separatamente alle tre tartarughe e vederne l'effetto:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
tina.forward(120)<BR>6</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
gina.forward(80)<BR>7<BR>&gt;&gt;&gt; pina.forward(40)<BR>8</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Dopo ogni comando
appare un numero, non preoccupiamoci di questo, non influenzer&agrave;
in alcun modo i nostri programmi.</P>
<H2 CLASS="western"><A NAME="comandi"></A>2.2. I primi comandi di
Tartaruga</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">La classe Turtle
fornisce qualche decina di metodi, ma i comandi base della grafica
della tartaruga sono pochi, e gi&agrave; con questi si possono
ottenere risultati piuttosto complessi. La tabella seguente riporta i
comandi che saranno utilizzati in questo documento:</P>
<TABLE WIDTH=100% BORDER=1 BORDERCOLOR="#000000" CELLPADDING=4 CELLSPACING=0 STYLE="page-break-before: auto; page-break-after: auto">
	<COL WIDTH=103*>
	<COL WIDTH=73*>
	<COL WIDTH=80*>
	<THEAD>
		<TR VALIGN=TOP>
			<TH WIDTH=40%>
				<P CLASS="western">sintassi</P>
			</TH>
			<TH WIDTH=29%>
				<P CLASS="western">esempio</P>
			</TH>
			<TH WIDTH=31%>
				<P CLASS="western">significato</P>
			</TH>
		</TR>
	</THEAD>
	<TBODY>
		<TR VALIGN=TOP>
			<TD WIDTH=40%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&lt;nome&gt;.forward(&lt;numero&gt;)</FONT></FONT></P>
			</TD>
			<TD WIDTH=29%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">tina.forward(100)</FONT></FONT></P>
			</TD>
			<TD WIDTH=31%>
				<P CLASS="western">Muove la tartaruga in avanti di un certo
				numero di passi. Se la penna &egrave; abbassata traccia un
				segmento.</P>
			</TD>
		</TR>
		<TR VALIGN=TOP>
			<TD WIDTH=40%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&lt;nome&gt;.back(&lt;numero&gt;)</FONT></FONT></P>
			</TD>
			<TD WIDTH=29%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">tina.back(67)</FONT></FONT></P>
			</TD>
			<TD WIDTH=31%>
				<P CLASS="western">Muove la tartaruga indietro di un certo numero
				di passi. Se la penna &egrave; abbassata traccia un segmento.</P>
			</TD>
		</TR>
		<TR VALIGN=TOP>
			<TD WIDTH=40%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&lt;nome&gt;.left(&lt;numero&gt;)</FONT></FONT></P>
			</TD>
			<TD WIDTH=29%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">tina.left(90)</FONT></FONT></P>
			</TD>
			<TD WIDTH=31%>
				<P CLASS="western">Ruota la tartaruga verso sinistra di un certo
				numero di gradi. La tartaruga non cambia la posizione, ma solo la
				direzione.</P>
			</TD>
		</TR>
		<TR VALIGN=TOP>
			<TD WIDTH=40%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&lt;nome&gt;.right(&lt;numero&gt;)</FONT></FONT></P>
			</TD>
			<TD WIDTH=29%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">tina.right(35)</FONT></FONT></P>
			</TD>
			<TD WIDTH=31%>
				<P CLASS="western">Ruota la tartaruga verso destra di un certo
				numero di gradi. La tartaruga non cambia la posizione, ma solo la
				direzione.</P>
			</TD>
		</TR>
		<TR VALIGN=TOP>
			<TD WIDTH=40%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&lt;nome&gt;.up()</FONT></FONT></P>
			</TD>
			<TD WIDTH=29%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">tina.up()</FONT></FONT></P>
			</TD>
			<TD WIDTH=31%>
				<P CLASS="western">Solleva la penna dal foglio. I prossimi
				movimenti non lasceranno traccia.</P>
			</TD>
		</TR>
		<TR VALIGN=TOP>
			<TD WIDTH=40%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&lt;nome&gt;.down()</FONT></FONT></P>
			</TD>
			<TD WIDTH=29%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">tina.down()</FONT></FONT></P>
			</TD>
			<TD WIDTH=31%>
				<P CLASS="western">Abbassa la penna sul foglio. I prossimi
				movimenti lasceranno traccia.</P>
			</TD>
		</TR>
		<TR VALIGN=TOP>
			<TD WIDTH=40%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&lt;nome&gt;.reset()</FONT></FONT></P>
			</TD>
			<TD WIDTH=29%>
				<P CLASS="western"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">tina.reset()</FONT></FONT></P>
			</TD>
			<TD WIDTH=31%>
				<P CLASS="western">Pulisce la finestra grafica e riporta
				Tartaruga allo stato iniziale.</P>
			</TD>
		</TR>
	</TBODY>
</TABLE>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Possiamo pasticciare un
po' con questi comandi, per prendere la mano con i metodi della
tartaruga e soprattutto con i vari errori che si possono fare:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
from pyturtle import Turtle<BR>&gt;&gt;&gt; tina=Turtle()<BR>&gt;&gt;&gt;
tina.forward(34)<BR>2<BR>&gt;&gt;&gt; tina.left(45)<BR>&gt;&gt;&gt;
tina.back(126)<BR>3<BR>&gt;&gt;&gt; tina.right(87)<BR>&gt;&gt;&gt;
tina.forword(84)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">Traceback
(most recent call last):<BR>File &quot;&lt;pyshell#16&gt;&quot;, line
1, in -toplevel-<BR>tina.forword(84)<BR>AttributeError: Turtle
instance has no attribute 'forword'</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Un errore nella
scrittura del nome del metodo.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
tina.forward(84)<BR>4<BR>&gt;&gt;&gt; tina.left(65)<BR>&gt;&gt;
Tina.up()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">Traceback
(most recent call last):<BR>File &quot;&lt;pyshell#17&gt;&quot;, line
1, in -toplevel-<BR>Tina.up()<BR>NameError: name 'Tina' is not
defined</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Python distingue tra
maiuscole e minuscole, quindi <KBD><FONT FACE="Bitstream Vera Sans Mono">Tina</FONT></KBD>
&egrave; diverso da <KBD><FONT FACE="Bitstream Vera Sans Mono">tina</FONT></KBD>,
da <KBD><FONT FACE="Bitstream Vera Sans Mono">tINa</FONT></KBD>, da
<KBD><FONT FACE="Bitstream Vera Sans Mono">tinA</FONT></KBD>, ...</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
tina.up()<BR>&gt;&gt;&gt; tina.forward(50)<BR>&gt;&gt;&gt;
tina.down()<BR>&gt;&gt;&gt; tina.forward(50)<BR>5<BR>&gt;&gt;&gt;
tina.up()<BR>&gt;&gt;&gt; tina.forward(50)<BR>&gt;&gt;&gt;
tina.down()<BR>&gt;&gt;&gt; tina.forward(50)<BR>6<BR>&gt;&gt;&gt;
tina.reset()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Oltre ai comandi della
grafica della tartaruga, c'&egrave; un comando di <KBD><SPAN STYLE="text-decoration: none">Python</SPAN></KBD>
molto comodo che utilizzeremo spesso. Programmando succedi di aver
bisogno di ripetere alcune istruzioni un certo numero di volte. &Egrave;
estremamente noioso riscriverle. Gli informatici, molto pigri, hanno
inventato un modo per risolvere questo problema: le istruzioni di
iterazione. In <KBD>Python</KBD> ce ne sono due, quella che
utilizzeremo qui &egrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">for
&lt;variabile&gt; in &lt;sequenza&gt;:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;blocco
di istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">ad esempio:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
for i in xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(100)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)</FONT></FONT></P>
<H2 CLASS="western"><A NAME="programma"></A>2.3. Il primo programma</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">La shell di IDLE &egrave;
molto comoda per sperimentare i vari comandi, i loro effetti e le
cause di errore. Ma se abbiamo in mente un progetto da realizzare
dobbiamo seguire un'altra strada: scrivere un programma. Un programma
Python non &egrave; altro che un file di testo che contiene i vari
comandi. Per iniziare un nuovo programma, apriamo da IDLE una nuova
finestra di testo, la salviamo con un nome che abbia l'estensione
&quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">.py</FONT></KBD>&quot;
e scriviamo in sequenza i comandi all'interno di questo file.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><IMG SRC="images/casetta.png" NAME="Immagine11" ALT="casetta" ALIGN=RIGHT WIDTH=137 HEIGHT=194 BORDER=0>Ad
esempio se vogliamo scrivere un programma che disegni la classica
casetta che si traccia senza sollevare la penna, possiamo seguire
questi passi:</P>
<OL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Avviare IDLE.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Aprire un nuovo
	editor: dal menu <KBD><FONT FACE="Bitstream Vera Sans Mono">File-New
	window</FONT></KBD>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Salvare con un
	nome che finisce per &quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">.py</FONT></KBD>&quot;</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Scrivere dei
	commenti che indichino contenuto autori e data.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Scrivere i primi
	comandi del programma.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Eseguire questi
	primi comandi premendo <KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;F5&gt;</FONT></KBD>.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Se tutto funziona
	come volevamo:</P>
	<OL>
		<LI><P CLASS="western" STYLE="margin-bottom: 0cm">aggiungere altri
		comandi e ritornare al punto 6.</P>
		<LI><P CLASS="western" STYLE="margin-bottom: 0cm">altrimenti
		correggere e ritornare al punto 6.</P>
	</OL>
</OL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Una possibile soluzione
si trova nel file <KBD><FONT FACE="Bitstream Vera Sans Mono">01casetta.py</FONT></KBD>.</P>
<H2 CLASS="western"><A NAME="procedure"></A>2.4. Procedure e sotto
procedure</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#000000"><IMG SRC="images/casa.png" NAME="Immagine1" ALT="casa" ALIGN=RIGHT HSPACE=4 WIDTH=172 HEIGHT=204 BORDER=1></FONT>Suponiamo
di voler disegnare una casetta stereotipata con le sue due finestre,
la porta il tetto a punta e un camino...</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">I ragazzi, di solito,
con grande impegno si mettono a scrivere istruzione dopo istruzione,
uno dopo l'altro, tutti i comandi per realizzarla. Il metodo
funziona, ma dal punto di vista informatico non &egrave; un &quot;buon&quot;
metodo. In generale &egrave; preferibile scomporre in parti il
problema, risolvere separatamente le varie parti e, mettendole
assieme, risolvere l'intero problema.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La scomposizione in
parti pu&ograve; essere fatta in vari modi, richiede un po' di
riflessione. Questa parte riguarda l'analisi del problema. Un'analisi
fatta bene &egrave; importante nella soluzione di problemi complessi.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Nel nostro caso
possiamo scomporre la casetta in due parti: tetto e facciata. Tetto
poi pu&ograve; essere suddiviso in falde e camino mentre facciata in
pareti e interno. A sua volta interno pu&ograve; essere suddiviso in
...</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il disegno seguente
vorrebbe esprime questa analisi. &Egrave; importante decidere, per
ogni sottoparte, dove deve partire e arrivare la tartaruga. 
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#000000"><IMG SRC="images/analisi.png" NAME="Immagine2" ALT="analisi" ALIGN=RIGHT WIDTH=363 HEIGHT=366 BORDER=1></FONT>Ogni
sottoparte diventa una procedura cio&egrave; una porzione di
programma a cui viene dato un nome: una funzione. La sintassi per
definire una funzione &egrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
&lt;nome&gt;(&lt;parametri&gt;):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;istruzioni&gt;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Quando &egrave;
possibile bisogna scrivere delle procedure trasparenti, procedure che
facciano solo quello che dichiarano nel nome, che non abbiano effetti
collaterali. In particolare Ogni procedura, a meno di casi
particolari, deve realizzare il disegno rimettendo la tartaruga dove
l'ha presa.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il programma pu&ograve;
essere costruito partendo dalla procedura principale, &quot;casa&quot;
e man mano che l'interprete dice di non conoscere una procedura,
aggiungerla. Io ho seguito questa strada nel programma seguente. Ha
lo svantaggio che si incomincia a vedere qualche risultato solo alla
terza procedura.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">L'altro metodo consiste
nel partire dai componenti che si trovano in fondo all'albero della
scomposizione (foglie). Ad esempio: scrivere la procedura per
disegnare una finestra, utilizzando questa disegnare le due finestre,
aggiungere la porta poi disegnare l'interno e cos&igrave; via.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">L'inizio del programma
(che si trova completo nel file <KBD><FONT FACE="Bitstream Vera Sans Mono">02casa.py</FONT></KBD>)
&egrave; il seguente:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">from
pyturtle import Turtle<BR>tina=Turtle()<BR><BR>def
casa():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Disegna l'intera
casetta.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;facciata()<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(100)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.right(90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tetto()<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.back(100)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.right(90)<BR><BR>def
facciata():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Disegna la
facciata.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;muri()<BR>&nbsp;&nbsp;&nbsp;&nbsp;interno()<BR><BR>def
muri():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Disegna il
controrno della facciata.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;for
i in xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(100)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR><BR>def
interno():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Disegna
l'interno della
facciata.&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(40)<BR>&nbsp;&nbsp;&nbsp;&nbsp;porta()<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.up()<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(60)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.right(90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.back(30)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.down()<BR>&nbsp;&nbsp;&nbsp;&nbsp;finestre()<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.up()<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.back(10)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.back(60)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.right(90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.down()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Scritta una parte del
programma, si preme come il solito <KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;F5&gt;</FONT></KBD>
per eseguirlo. Se <KBD>Python</KBD> riscontra degli errori li
segnala. Se non ci sono errori, non succede assolutamente niente.
Infatti i comandi precedenti hanno costruito le funzioni, per vedere
il loro effetto bisogna eseguirle. Dalla shell di IDLE si pu&ograve;
dare il comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;casa()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Oppure si pu&ograve;
scrivere in fondo al programma:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">casa()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">in questo modo quando
si esegue il programma vengono <KBD>Python</KBD> impara tutte le
funzioni poi esegue la funzione <KBD><FONT FACE="Bitstream Vera Sans Mono">casa()</FONT></KBD>.
Ovviamente durante la costruzione il programma si inchioda con un
errore perch&eacute; non trova la definizione di una qualche
funzione. A questo punto basta aggiungere la funzione e vedere se
tutto procede secondo le nostre intenzioni.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Tutto il programma &egrave;
contenuto nel file <KBD><FONT FACE="Bitstream Vera Sans Mono">02casa.py</FONT></KBD>.</P>
<H2 CLASS="western"><A NAME="parametri"></A>2.5. Parametri</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Nel costruire la
casetta abbiamo incontrato due procedure molto simili: finestra e
muri. Nei programmi capita spesso di dover ripetere dei pezzi di
codice quasi uguali e, dato che gli informatici sono molto pigri,
hanno inventato dei meccanismi per evitare di riscrivere procedure
cos&igrave; simili. Per vedere come, incominciamo scrivendo, in un
nuovo file, due procedure: una per disegnare un quadratino e una per
disegnare un quadratone:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">from
pyturtle import Turtle<BR>tina=Turtle()<BR><BR>def
quadratino():<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(23)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR><BR>def
quadratone():<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(107)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">ora eseguiamo il
programma (<KBD><FONT FACE="Bitstream Vera Sans Mono">&lt;F5&gt;</FONT></KBD>)
e poi nella shell proviamo le due funzioni:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
quadratino()<BR>&gt;&gt;&gt; quadratone()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Vanno. Ora evidenziamo
le differenze tra le due funzioni:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
quadratino():<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(<SPAN STYLE="background: #ffff00">23</SPAN>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR><BR>def
quadratone():<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(<SPAN STYLE="background: #ffff00">107</SPAN>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">L'unica differenza &egrave;
il numero che indica la misura del lato del quadrato. Ora &egrave;
possibile scrivere un'unica funzione con quel dato variabile. Nei
linguaggi di programmazione ogni variabile ha un suo nome. &Egrave;
bene che il nome rispecchi la funzione della variabile: in questo
caso scegliamo come nome la parola <FONT FACE="Bitstream Vera Sans Mono">lato</FONT>.
qualcosa del genere:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
quadrato():<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ma se proviamo ad
eseguirla, <KBD>Python</KBD> ci avvertir&agrave; che alla parola <KBD><FONT FACE="Bitstream Vera Sans Mono">lato</FONT></KBD>
non &egrave; associato nessun valore. Si deve dire all'interprete che
questa funzione ha bisogno di un'informazione che verr&agrave; messa
nella variabile di nome lato. Il meccanismo per fare ci&ograve; &egrave;
scrivere il nome della variabile nella coppia di parentesi che segue
il nome della funzione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
quadrato(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">ora se proviamo a
eseguire <KBD>quadrato()</KBD> otteniamo un messaggio di errore:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
quadrato()<BR><BR>Traceback (most recent call last):<BR>File
&quot;&lt;pyshell#1&gt;&quot;, line 1, in
-toplevel-<BR>quadrato()<BR>TypeError: quadrato() takes exactly 1
argument (0 given)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Quando invochiamo
questa funzione dobbiamo passarle un argomento: il valore da mettere
nella variabile lato:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
quadrato(50)<BR>&gt;&gt;&gt; quadrato(60)<BR>&gt;&gt;&gt;
quadrato(70)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Capito il trucco,
possiamo scrivere procedure per disegnare triangoli, pentagoni,
esagoni, ... con i lati variabili:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
triangolo(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(3):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(120)<BR><BR>def
esagono(lato):<BR>for i in
xrange(6):<BR>tina.forward(lato)<BR>tina.left(60)<BR><BR>def
pentagono(lato):<BR>for i in
xrange(5):<BR>tina.forward(lato)<BR>tina.left(72)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">e provarle:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
triangolo(50)<BR>&gt;&gt;&gt; quadrato(50)<BR>&gt;&gt;&gt;
pentagono(50)<BR>&gt;&gt;&gt; esagono(50)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ma anche queste
funzioni si assomigliano. Questa volta per&ograve; ci sono due numeri
che cambiano oltre al lato:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
esagono(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(<SPAN STYLE="background: #ff9966">6</SPAN>):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(<SPAN STYLE="background: #00dcff">60</SPAN>)<BR><BR>def
pentagono(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(<SPAN STYLE="background: #ff9966">5</SPAN>):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(<SPAN STYLE="background: #00dcff">72</SPAN>)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Proviamo a riunire in
una tabella questi valori:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<TABLE WIDTH=443 BORDER=1 BORDERCOLOR="#000000" CELLPADDING=4 CELLSPACING=0>
	<COL WIDTH=164>
	<COL WIDTH=114>
	<COL WIDTH=139>
	<THEAD>
		<TR VALIGN=TOP>
			<TH WIDTH=164>
				<P CLASS="western">poligono regolare</P>
			</TH>
			<TH WIDTH=114>
				<P CLASS="western">numero lati</P>
			</TH>
			<TH WIDTH=139>
				<P CLASS="western">ampiezza angolo</P>
			</TH>
		</TR>
	</THEAD>
	<TBODY>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">biangolo??</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="2" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>2</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="180" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>180</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">triangolo</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="3" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>3</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="120" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>120</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">quadrato</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="4" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>4</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="90" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>90</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">pentagono</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="5" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>5</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="72" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>72</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">esagono</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="6" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>6</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="60" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>60</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">ettagono</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="7" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>7</P>
			</TD>
			<TD WIDTH=139 VALIGN=TOP>
				<P CLASS="western" ALIGN=CENTER>51 circa</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">ottagono</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="8" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>8</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="45" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>45</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">ennagono</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="9" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>9</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="40" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>40</P>
			</TD>
		</TR>
		<TR>
			<TD WIDTH=164 VALIGN=TOP>
				<P CLASS="western">decagono</P>
			</TD>
			<TD WIDTH=114 VALIGN=BOTTOM SDVAL="10" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>10</P>
			</TD>
			<TD WIDTH=139 VALIGN=BOTTOM SDVAL="36" SDNUM="1040;">
				<P CLASS="western" ALIGN=CENTER>36</P>
			</TD>
		</TR>
		<TR VALIGN=TOP>
			<TD WIDTH=164>
				<P CLASS="western">poligono di enne lati</P>
			</TD>
			<TD WIDTH=114>
				<P CLASS="western" ALIGN=CENTER>n</P>
			</TD>
			<TD WIDTH=139>
				<P CLASS="western" ALIGN=CENTER>???</P>
			</TD>
		</TR>
	</TBODY>
</TABLE>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se il numero dei lati &egrave;
n allora l'angolo esterno del poligono regolare &egrave;: <KBD>360/n</KBD>.
Se vogliamo che <KBD>Python</KBD> esegua la divisione con numeri
decimali, almeno uno dei due operandi deve essere un numero con la
virgola: <KBD>360./n</KBD> altrimenti <KBD>Python</KBD> esegue la
divisione troncata all'intero. Possiamo allora aggiungere come
parametro il numero dei lati del poligono e scrivere la seguente
funzione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
poligono(n, lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(n):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(360./n)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questa sostituisce
tutte quelle precedenti e permette di disegnare poligoni con
qualunque numero di lati di qualunque dimensione. Una sola funzione
ne sostituisce infinite!</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se poi voglio una
procedura che disegni vari poligoni dal triangolo fino a un poligono
di n lati:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
poligoni(lato, n):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in xrange(3,
n):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poligono(i,
lato)<BR><BR>&gt;&gt;&gt; poligoni(30, 20)</FONT></FONT></P>
<H2 CLASS="western"><A NAME="quadrati"></A>2.6. Quadrati</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Le procedure dotate di
parametri, anche se semplicissime, possono permettere la
realizzazione di figure complesse in modo abbastanza semplice.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Incominciamo un nuovo
programma (il file completo &egrave; <KBD><FONT FACE="Bitstream Vera Sans Mono">05quadrati.py</FONT></KBD>)
e riscriviamo nel programma la funzione <KBD><FONT FACE="Bitstream Vera Sans Mono">quadrato(lato)</FONT></KBD>
vista nel capitolo precedente.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">from
pyturtle import Turtle<BR>tina=Turtle()<BR><BR>def
quadrato(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#000000"><IMG SRC="images/quadrati.png" NAME="Immagine3" ALT="quadrati" ALIGN=RIGHT WIDTH=145 HEIGHT=162 BORDER=1></FONT>Ora
scriviamo una procedura che disegni quadrati uno dentro l'altro:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La differenza tra un
lato del quadrato e l'altro &egrave; di 10 passi.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
quadrati(n):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in xrange(10, n*10,
10):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quadrato(i)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Come al solito
eseguiamo il programma (<KBD>&lt;F5&gt;</KBD>) e da IDLE diamo il
comando:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
quadrati(15)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ripetendo quattro volte
quadrati() possiamo costruire una griglia:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
griglia(n):<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(4):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quadrati(n)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(90)<BR><BR>&gt;&gt;&gt;
griglia(20)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Se invece di disegnare
quadrati uno dentro l'altro, vogliamo disegnare quadrati uno di
seguito all'altro otteniamo una fila di quadrati:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
fila(d):<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
d&gt;2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quadrato(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=d/2.</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Come al solito
eseguiamo il programma e poi proviamo la funzione:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">&gt;&gt;&gt;
fila(100)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Funziona. Ma oltre a
disegnare la fila di quadrati, sposta la tartaruga. E questo non &egrave;
bello... Dobbiamo scrivere una procedura trasparente, che disegni i
quadrati, ma lasci la tartaruga dove l'ha presa. Penso che ci siano
diverse soluzioni, questa &egrave; una possibile:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
fila(d):<BR>&nbsp;&nbsp;&nbsp;&nbsp;di=d<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
d&gt;2:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quadrato(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=d/2.<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
d&lt;di:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d=d*2.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.back(d)<BR><BR></FONT><FONT FACE="bitstream vera sans mono">&gt;&gt;&gt;
fila(100)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Funziona. Ma proviamo a
vedere la cosa in modo un po' pi&ugrave; astratto. Che cosa &egrave;
una fila di quadrati? In prima approssimazione possiamo dire che &quot;una
fila di quadrati&quot; &egrave; &quot;un quadrato seguito da una fila
di quadrati&quot;. Pare strano ma la cosa funziona... quasi. L'unico
problema &egrave; che con una definizione cos&igrave; la fila
continua all'infinito. Una definizione funzionante &egrave; questa:</P>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">se la fila ha
	dimensione minore di 2 &egrave; gi&agrave; finita</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">altrimenti la fila
	&egrave; un quadrato seguito da uno spostamento, seguito da una fila
	di dimensione pi&ugrave; piccola.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm">Chiamiamo <KBD>filar(d)</KBD>
la funzione ricorsiva che disegna la fila di quadrati:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
filar(d):<BR>&nbsp;&nbsp;&nbsp;&nbsp;if d&lt;2:
return<BR>&nbsp;&nbsp;&nbsp;&nbsp;quadrato(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;filar(d/2.)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Funziona, ma anche
questa non &egrave; trasparente, come pu&ograve; fare per rimettere a
posto la tartaruga? Pu&ograve; sembrare strano, ma basta che la
funzione rimetta a posto la tartaruga solo di quanto l'ha spostata:
poich&eacute; dopo aver disegnato il quadrato ha spostato la
tartaruga di d, dopo aver disegnato il resto della fila deve
rispostarla indietro della stessa quantit&agrave;:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
filar(d):<BR>&nbsp;&nbsp;&nbsp;&nbsp;if d&lt;2:
return<BR>&nbsp;&nbsp;&nbsp;&nbsp;quadrato(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(d)<BR>&nbsp;&nbsp;&nbsp;&nbsp;filar(d/2.)<BR>&nbsp;&nbsp;&nbsp;&nbsp;tina.back(d)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Osservazione: pur
essendo poco abituati a descrivere funzioni ricorsive bisogna
ammettere che queste risultano pi&ugrave; semplici e compatte.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Per esercizio si pu&ograve;
provare a realizzare una coda e una coda ricorsiva fatta da una fila
di quadrati leggermente ruotati tra di loro...</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Come sempre queste
procedure possono essere utilizzate come componenti base per
realizzare figure pi&ugrave; complesse.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H2 CLASS="western"><A NAME="frattali"></A>2.7. Figure frattali</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Abbiamo visto che le
funzioni ricorsive permettono una grande sintesi. Ma non solo, le
funzioni ricorsive sono collegate ad un campo di ricerca molto
interessante: le figure frattali. Una figura frattale &egrave; una
figura che si replica, al suo interno, a diverse scale. Esistono
molte figure frattali noi realizzeremo il triangolo di Sierpinski e
qualche sua variante. Il triangolo di Sierpinski si ottiene partendo
da un triangolo equilatero:</P>
<OL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Si congiungono i
	punti medi dei lati.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Si elimina il
	triangolo cos&igrave; ottenuto.</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Si ripetono queste
	3 operazioni per i tre triangoli rimasti.</P>
</OL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#000000"><IMG SRC="images/sierpinski.png" NAME="Immagine4" ALT="sierpinski" ALIGN=RIGHT HSPACE=4 WIDTH=191 HEIGHT=659 BORDER=1></FONT>(In
figura ho riportato le prime quattro iterazioni)</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ora, il nostro
obiettivo &egrave; realizzare l'ultima figura in basso, o qualche
figura maggiormente intarsiata. La faccenda pu&ograve; sembrare molto
complicata, e lo &egrave; se non fosse che la complicazione viene
gestita dalla ricorsione. Il livello zero &egrave; costituito da un
solo triangolo equilatero. Il livello uno &egrave; costituito da tre
triangoli ruotati di <KBD>120</KBD> gradi. Per disegnare questo
livello basta:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sierp_uno(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;per 3
volte:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disegnare
un triangolo di lato=lato/2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;andare
avanti di lato<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruotare
di 120 gradi a sinistra</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Bene, per realizzare il
gioco, basta che i tre triangoli che vengono disegnati, invece di
essere dei normali triangoli siano dei triangoli di Sierpinski:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
sierp(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;per 3
volte:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;disegnare
un sierp(lato/2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;andare
avanti di lato<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruotare
di 120 gradi a sinistra</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Scritta solo cos&igrave;
la funzione continuerebbe a disegnare triangoli di Sierpinski sempre
pi&ugrave; piccoli, in basso a sinistra, raggiungendo dimensioni
infinitesime senza mai passare agli altri due triangoli. Bisogna
mettere una condizione di terminazione della ricorsione.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Siamo pronti per
realizzare il programma:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">from
pyturtle import Turtle<BR>tina=Turtle()<BR><BR>def
triangolo_sierpinski(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;if lato&lt;5:
return<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(3):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triangolo_sierpinski(lato/2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(120)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Io resto sempre stupito
nel vedere la complessit&agrave; di risultati che si pu&ograve;
ottenere dalle poche righe di una funzione ricorsiva.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Queste funzioni si
prestano a piccole modifiche che cambiano notevolmente i risultati.
Cosa succede se scambiamo la chiamata ricorsiva con l'istruzione che
la segue?</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
angolotri_sierpinski(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;if lato&lt;5:
return<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(3):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angolotri_sierpinski(lato/2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(120)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La differenza &egrave;
notevole!</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">E se il sottotriangolo
di Sierpinski lo disegnamo a met&agrave; lato e rivolto verso
l'esterno invece che in fondo e in linea?</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
triangolo_esterno(lato):<BR>&nbsp;&nbsp;&nbsp;&nbsp;if lato&lt;5:
return<BR>&nbsp;&nbsp;&nbsp;&nbsp;for i in
xrange(3):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato/2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.right(120)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;triangolo_esterno(lato/2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(120)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.forward(lato/2)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tina.left(120)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Dal testo base della
geometria della tartaruga si possono ricavare molte altre idee per
realizzare disegni frattali con funzioni ricorsive.</P>
<H2 CLASS="western"><A NAME="tartarughe"></A>2.8. Creare nuove
tartarughe</H2>
<P CLASS="western" STYLE="margin-bottom: 0cm">Come visto nel
paragrafo 2.2. che per utilizzare la grafica della tartaruga bisogna
crearne una, cio&egrave; creare un oggetto della classe <KBD><FONT FACE="Bitstream Vera Sans Mono">Turtle</FONT></KBD>.
Abbiamo anche visto che nello stesso piano possono convivere pi&ugrave;
tartarughe. Da una classe &egrave; possibile far discendere un'altra
classe che eredita tutti gli attributi e tutti i metodi della classe
genitrice. Quindi &egrave; possibile derivare un altro animale da una
tartaruga (ingegneria genetica?). Questo nuovo animale avr&agrave;
tutte le caratteristiche delle tartarughe, tranne quelle che
modifichiamo e, in pi&ugrave;, potr&agrave; essere in grado di
rispondere a degli altri comandi.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Nel prossimo programma
vogliamo realizzare una classe <FONT FACE="Bitstream Vera Sans Mono">Gatto</FONT>
specializzata nell'inseguire e una classe <FONT FACE="Bitstream Vera Sans Mono">Topo</FONT>
specializzata nello scappare. Tutto il programma si trova nel file
<KBD><FONT FACE="Bitstream Vera Sans Mono">07gattopo.py</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Come il solito prima di
iniziare dobbiamo importare le librerie necessarie, oltre a pyturtle
anche random:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">from
random import randrange<BR>from pyturtle import Turtle</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Poi possono essere
utili un paio di costanti (in <KBD>Python</KBD> non esistono
costanti, si segue la convenzione di dare alle &quot;costanti&quot;
nomi tutti maiuscoli):</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">VTOPO=.6<BR>VGATTO=.6</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La classe Topo deriva
dalla classe <KBD>Turtle</KBD>, quindi bisogna definirla in questo
modo:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">class
Topo(Turtle):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Classe che
simula il comportamento di un topo.&quot;&quot;&quot;</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La seconda riga &egrave;
una riga di commento, sempre utile...</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il metodo
<KBD><FONT FACE="Bitstream Vera Sans Mono">__init__(self)</FONT></KBD>
della classe viene invocato ogni volta che viene creato un nuovo
oggetto di questa classe. Nel nostro caso <KBD><FONT FACE="Bitstream Vera Sans Mono">__init__(self)</FONT></KBD>
scrive qualcosa e poi posiziona il <FONT FACE="Bitstream Vera Sans Mono">topo</FONT>
in un punto a caso intorno al centro del piano. Ogni metodo di una
classe contiene una variabile (convenzionalmente chiamata &quot;<KBD><FONT FACE="Bitstream Vera Sans Mono">self</FONT></KBD>&quot;)
che punta all'oggetto che deve eseguire il metodo.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
__init__(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Turtle.__init__(self)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;piano=self._plane<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.up()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setpos((piano.s2x(20),
piano.s2y(20)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.write(&quot;inseguimento
in base alla vista&quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setpos((randrange(120)-60,
randrange(80)-40))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.down()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Il metodo chiave di
<KBD>Topo</KBD> &egrave; il metodo <KBD><FONT FACE="Bitstream Vera Sans Mono">scappa(self,
da)</FONT></KBD>. Questa versione presenta un modo di fuga abbastanza
semplice: se l'animale da cui si vuole fuggire &egrave; proprio
davanti o proprio dietro, si opera una deviazione casuale piuttosto
ampia, altrimenti si fugge variando di poco la direzione. Il metodo
<KBD><FONT FACE="Bitstream Vera Sans Mono">dirto(&lt;posizione&gt;)</FONT></KBD>
restituisce la direzione sotto cui la tartaruga (e ogni suo
discendente) vede la posizione data.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
scappa(self, da):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Fa
muovere il topo di un passo<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cercando
di scappare da
da&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dir_gatto=self.dirto(da.getpos())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
170&lt;dir_gatto&lt;190 or
-10&lt;dir_gatto&lt;10:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.right(randrange(180)-90)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
dir_gatto<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.left(randrange(20)-10)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.forward(VTOPO)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Questo comportamento
non &egrave; molto efficace, infatti, a pari velocit&agrave;, il topo
viene mangiato piuttosto presto.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Ora dobbiamo definire
la classe <KBD>Gatto</KBD>. Il <KBD>Gatto</KBD> &egrave; una
tartaruga un po' pi&ugrave; grossa, grigia, che vive nello stesso
piano del topo. Quindi, quando si crea un <KBD>Gatto</KBD> bisogna
indicargli il piano in cui crearsi:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">class
Gatto(Turtle):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Classe
che simula il comportamento di un gatto&quot;&quot;&quot;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;def
__init__(self, piano):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Turtle.__init__(self,
piano)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setcolor(&quot;grey&quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setwidth(3)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Caratteristica del
Gatto &egrave; quella di inseguire il Topo. Quindi dobbiamo scrivere
il metodo <KBD><FONT FACE="Bitstream Vera Sans Mono">insegui(self,
chi)</FONT></KBD>. Il metodo ha due parametri: il primo, <KBD><FONT FACE="Bitstream Vera Sans Mono">self</FONT></KBD>,
conterr&agrave; il riferimento al particolare oggetto che esegue il
metodo, il secondo, <KBD><FONT FACE="Bitstream Vera Sans Mono">chi</FONT></KBD>,
contiene il riferimento all'oggetto che viene inseguito. Il metodo
insegui, &egrave; una funzione che restituisce <KBD>0</KBD> quando il
topo arriva a portata degli artigli del gatto. In questo modo il
ciclo principale, che fa muovere a turno il gatto il topo, sa quando
deve fermarsi.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Quindi <KBD><FONT FACE="Bitstream Vera Sans Mono">insegui(...)</FONT></KBD>,
per prima cosa verifica la distanza dal fuggitivo e, se &egrave;
inferiore a un valore predefinito, scrive qualcosa e restituisce <KBD><FONT FACE="Bitstream Vera Sans Mono">0</FONT></KBD>.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm">Altrimenti individua la
direzione del fuggitivo e curva di un pochino verso di lui. Bisogna
notare che, avendo il gatto una massa di molto superiore a quella del
topo, non pu&ograve; cambiare direzione con la stessa sua rapidit&agrave;.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000">&nbsp;&nbsp;&nbsp;&nbsp;<FONT FACE="Bitstream Vera Sans Mono">def
insegui(self, chi):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Fa
muovere il gatto di un passo come se inseguisse
chi.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;restituisce 0
se ha raggiunto chi&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
self.distance(chi.getpos())&lt;3:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setpos(chi.getpos())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.setcolor(&quot;red&quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.write(&quot;
Buono questo topolino!!!&quot;)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dir_topo=self.dirto(chi.getpos())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if
dir_topo&lt;180:&nbsp;&nbsp;self.left(randrange(5))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.right(randrange(5))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.forward(VGATTO)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
1</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">La funzione che
realizza l'inseguimento, Crea un oggetto della classe <KBD>Topo</KBD>
(notare che &quot;<KBD>topo</KBD>&quot; e &quot;<KBD>Topo</KBD>&quot;,
in <KBD>Python</KBD>, sono due parole diverse), poi crea un oggetto
della classe <KBD>Gatto</KBD> (stessa osservazione per &quot;<KBD>gatto</KBD>&quot;
e &quot;<KBD>Gatto</KBD>&quot;). A quest'ultimo indica in quale piano
deve vivere. Poi avvia un ciclo che continua finch&eacute; gatto non
restituisce <KBD><FONT FACE="Bitstream Vera Sans Mono">0</FONT></KBD>
indicando cos&igrave; l'avvenuta cattura.</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">def
insegui():<BR>&nbsp;&nbsp;&nbsp;&nbsp;&quot;&quot;&quot;Simula
l'inseguimento tra un gatto e un
topo&quot;&quot;&quot;<BR>&nbsp;&nbsp;&nbsp;&nbsp;topo=Topo()<BR>&nbsp;&nbsp;&nbsp;&nbsp;gatto=Gatto(topo.getplane())<BR>&nbsp;&nbsp;&nbsp;&nbsp;while
gatto.insegui(topo): topo.scappa(gatto)</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm">A questo punto non
resta altro che invocare la funzione insegui e il gioco &egrave;
fatto:</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm; page-break-before: auto; page-break-after: auto">
<FONT COLOR="#808000"><FONT FACE="Bitstream Vera Sans Mono">insegui()</FONT></FONT></P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="licenza"></A>3. Licenza</H1>
<P CLASS="western" STYLE="margin-bottom: 0cm">Pur assumendomi tutte
le responsabilit&agrave; sulle sciocchezze che ho scritto in questo
testo, devo riconoscere che, tutto quello che so, mi &egrave; stato
trasmesso con passione, generosit&agrave; e pazienza da altri.
Cosciente di questo, metto a disposizione di chiunque sia interessato
quello che ho scritto, nella speranza che possa essere utile.<BR>Le
librerie pycart, pyplot e pyturtle, tutti gli esempi che le
completano, il manuale e gli altri testi che ne spiegano l'uso,
vengono cedute tutte con licenza GNU Free Documentation License
(<A HREF="http://www.gnu.org/">http://www.gnu.org</A>) che vi
permette di:</P>
<OL START=0>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Utilizzare
	questo documento per qualunque scopo, senza vincoli sul suo
	utilizzo.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Modificare
	il documento e adattarlo alle vostre esigenze.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Ridistribuire
	copie del documento originale o modificato.</FONT></FONT></P>
</OL>
<P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><BR>
</P>
<P CLASS="western" STYLE="margin-bottom: 0cm"><B>con le seguenti
condizioni:</B></P>
<P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><BR>
</P>
<OL START=0>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Sia
	sempre distribuito con questa licenza anche ogni lavoro derivato, in
	tutto o in parte, da esso.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Sia
	citato l'autore originale e il sito di provenienza.</FONT></FONT></P>
	<LI><P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><FONT FACE="Helvetica, sans-serif"><FONT SIZE=3>Non
	venga snaturato nella sostanza o nella forma il contenuto originale.</FONT></FONT></P>
</OL>
<P CLASS="western" ALIGN=LEFT STYLE="margin-bottom: 0cm"><BR>
</P>
<H1 CLASS="western"><A NAME="biblio"></A>4. Bibliografia</H1>
<UL>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">La bibbia della
	<B>geometria della Tartaruga</B> &egrave; anche tradotta in
	italiano:<BR>H.Abelson, A.Disessa &quot;La geometria della
	tartaruga&quot;, 1986, Franco Muzio &amp; c. editore</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Un manualetto
	sulle librerie pycart.py, pyplot.py e pyturtle.py, si trova in
	/opt/doc/pygraph</P>
	<LI><P CLASS="western" STYLE="margin-bottom: 0cm">Per quanto
	riguarda Python il sito di riferimento &egrave; <A HREF="www.python.org">www.python.org</A>
	mentre il riferimento italiano <A HREF="http://www.python.it/">www.python.it</A>.
	Qui si possono trovare manuali, articoli, presentazioni, esempi e
	link a materiali di tutti i tipi originali, tradotti o in inglese.</P>
</UL>
<P CLASS="western" STYLE="margin-bottom: 0cm"><BR>
</P>
</BODY>
</HTML>